多思多想,根据函数定义找隐藏信息

今天遇到一个很长时间都没发现的问题

先看看这个函数定义:

struct tm *localtime(const time_t *clock);

一般情况下大家都不会觉得这个函数有什么问题

使用的时候通常会根据习惯这样写:

struct tm *pTime = localtime(const time_t *clock);

当然,一般这样用是没问题的,函数返回指针,我用指针接收它,当然不会有问题

但是当你仔细想想这个指针的存储位置时,你可能会想到一个很容易被忽略的问题:

第一:它不可能是栈地址,原因不用说,因为从下层堆栈返回一个栈地址给上层堆栈肯定是用不了的,会报段错误。

第二:它可能是new出来的堆地址,如果真是这样他肯定还会写一个回收这个地址的接口。或者他也会在说明文档里说明,那就要调用者自己去delete,当然这样很不友好,容易导致内存泄露,一般不会这样做。

第三:它可能是一个静态地址,如果真是这样。那你就得注意了,任何调用这个接口的地方返回的都是同一个地址,你必须即取即用。

第四:它可能是一个上层堆栈传进去的上层栈地址,但是从这个接口来看根本没有传地址进去,所有这个情况也不可能。

说了这么多,那么我们来看看这个函数的说明:

The return value points to a statically allocated struct which might be
overwritten by subsequent calls to any of the date and time functions.

这里已经清楚的说明这个函数是返回了一个静态结构体指针。每次调用都会覆盖里面的数据。

留下只言片语: